#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=50010;
struct Line
{
	int x,y1,y2,flag;
	bool friend operator<(Line a,Line b)
	{
		return a.x<b.x;
	}
}line[maxn*8];
int y[maxn*8],n,t;
struct node
{
	int left,right,lf,ri,len,cov;
}tree[maxn*16];

void build(int L,int R,int u)
{
	tree[u].left=L;
	tree[u].right=R;
	tree[u].lf=y[L];
	tree[u].ri=y[R];
	tree[u].cov=tree[u].len=0;
	if(L+1==R)return;
	int mid=(L+R)/2;
	build(L,mid,u*2);
	build(mid,R,u*2+1);
}
void update(int u,Line e)
{
	if(e.y1<=tree[u].lf&&e.y2>=tree[u].ri)
	{
		if(e.flag==1)
		{
			tree[u].len=tree[u].ri-tree[u].lf;
			tree[u].cov++;
		}
		else
		{
			tree[u].cov--;
			if(tree[u].cov==0)
			{
				if(tree[u].left+1==tree[u].right)
					tree[u].len=0;
				else 
					tree[u].len=tree[u*2].len+tree[u*2+1].len;
			}
		}
		return;
	}
	if(e.y1<tree[u*2].ri)update(u*2,e);
	if(e.y2>tree[u*2+1].lf)update(u*2+1,e);
	if(tree[u].cov==0)
		tree[u].len=tree[u*2].len+tree[u*2+1].len;
}
void add(int x1,int y1,int x2,int y2)
{
	if(x1==x2||y1==y2)return;
	t++;
	line[t].x=x1;
	line[t].y1=y1;
	line[t].y2=y2;
	line[t].flag=1;
	t++;
	line[t].x=x2;
	line[t].y1=y1;
	line[t].y2=y2;
	line[t].flag=-1;
}

int main()
{
	while(scanf("%d",&n)&&n)
	{
		t=0;
		for(int i=1;i<=n;i++)
		{
			int x1,x2,x3,x4,y1,y2,y3,y4;
			scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
			add(x1,y1,x4,y3);
			add(x4,y1,x2,y4);
			add(x3,y4,x2,y2);
			add(x1,y3,x3,y2);
			y[4*i-3]=y1;
			y[4*i-2]=y2;
			y[4*i-1]=y3;
			y[4*i]=y4;
		}
		sort(line+1,line+t+1);
		sort(y+1,y+4*n+1);
		build(1,4*n,1);
		update(1,line[1]);
		long long ans=0;
		for(int i=2;i<=t;i++)
		{
			ans+=(long long )(line[i].x-line[i-1].x)*tre
